/*
* Copyright 2010 the original author or authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.spring.components.config.xml;
import org.activiti.spring.components.ActivitiContextUtils;
import org.activiti.spring.components.aop.ProcessStartAnnotationBeanPostProcessor;
import org.activiti.spring.components.scope.ProcessScope;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.core.Conventions;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
/**
* registers support for handling the annotations in the org.activiti.engine.annotations package.
* <p/>
* The first major component is the state handlers. For this to work, a BeanFactoryPostProcessor is registered which in turn registers a
* {@link org.activiti.spring.components.registry.ActivitiStateHandlerRegistry} if none exists.
*
* @author Josh Long
* @since 5.3
*/
public class ActivitiAnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private final String processEngineAttribute = "process-engine";
public BeanDefinition parse(Element element, ParserContext parserContext) {
registerProcessScope(element, parserContext);
registerStateHandlerAnnotationBeanFactoryPostProcessor(element, parserContext);
registerProcessStartAnnotationBeanPostProcessor(element, parserContext);
return null;
}
private void configureProcessEngine(AbstractBeanDefinition abstractBeanDefinition, Element element) {
String procEngineRef = element.getAttribute(processEngineAttribute);
if (StringUtils.hasText(procEngineRef))
abstractBeanDefinition.getPropertyValues().add(Conventions.attributeNameToPropertyName(processEngineAttribute), new RuntimeBeanReference(procEngineRef));
}
@Deprecated
private void registerStateHandlerAnnotationBeanFactoryPostProcessor(Element element, ParserContext context) {
Class clz = StateHandlerAnnotationBeanFactoryPostProcessor.class;
BeanDefinitionBuilder postProcessorBuilder = BeanDefinitionBuilder.genericBeanDefinition(clz.getName());
BeanDefinitionHolder postProcessorHolder = new BeanDefinitionHolder(
postProcessorBuilder.getBeanDefinition(),
ActivitiContextUtils.ANNOTATION_STATE_HANDLER_BEAN_FACTORY_POST_PROCESSOR_BEAN_NAME);
configureProcessEngine(postProcessorBuilder.getBeanDefinition(), element);
BeanDefinitionReaderUtils.registerBeanDefinition(postProcessorHolder, context.getRegistry());
}
private void registerProcessScope(Element element, ParserContext parserContext) {
Class clz = ProcessScope.class;
BeanDefinitionBuilder processScopeBDBuilder = BeanDefinitionBuilder.genericBeanDefinition(clz);
AbstractBeanDefinition scopeBeanDefinition = processScopeBDBuilder.getBeanDefinition();
scopeBeanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
configureProcessEngine(scopeBeanDefinition, element);
String beanName = baseBeanName(clz);
parserContext.getRegistry().registerBeanDefinition(beanName, scopeBeanDefinition);
}
private void registerProcessStartAnnotationBeanPostProcessor(Element element, ParserContext parserContext) {
Class clz = ProcessStartAnnotationBeanPostProcessor.class;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clz);
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
configureProcessEngine(beanDefinition, element);
String beanName = baseBeanName(clz);
parserContext.getRegistry().registerBeanDefinition(beanName, beanDefinition);
}
private String baseBeanName(Class cl) {
return cl.getName().toLowerCase();
}
}